
#include "ola_stdint.h"
#include "ola_stdio.h"
#include "ola_string.h"
#include "ola_thread.h"
#include "ola_memory.h"

#ifdef __LINUX_PAL__
#include <sys/stat.h>
#endif

static ola_pal_mutex_t g_file_mtx = NULL;

/***************************************************************
功   能：向flash中存储字符串，要保证掉电不丢失。
参   数：
    key   : 存取字符串的索引。
    value : 存储的字符串。
返回值 ：
    >=0返回存储的字节数，
    -1，存储失败。
***************************************************************/
int32_t ola_pal_flash_SetString(const char *key, const char *value)
{
    if (value == NULL)
    {
        return -1;
    }
    
#ifdef __LINUX_PAL__
    int32_t length;
    void *fd;
    if ( !g_file_mtx )
    {
        g_file_mtx = ola_pal_mutex_create(OLA_PAL_MUTEX_TYPE_NORMAL);
    }
    
    ola_pal_mutex_lock(g_file_mtx);    

    fd = ola_pal_fopen(key, "wb+" );
    length = ola_pal_fwrite(value, 1, ola_pal_strlen(value), fd );
    ola_pal_fclose(fd);

    ola_pal_mutex_unlock(g_file_mtx);
    return length;
#else
    return -1;
#endif

}

/***************************************************************
功   能：从flash中获取字符串，key是索引。
参   数：
    key   : 获取字符串的索引。
    value : 输出存储的字符串。
    len : buff的长度。
返回值 ：
    >=0，获取到的字符串的长度，
    -1，获取失败，没有查找到key的索引。
***************************************************************/
int32_t ola_pal_flash_GetString(const char *key, char **value)
{
    if (value == NULL)
    {
        return -1;
    }
    
#ifdef __LINUX_PAL__
    int32_t length = -1;
    void *fd;
    struct stat file_info;
    char *buffer;

    *value = NULL;

    if ( !g_file_mtx )
    {
        g_file_mtx = ola_pal_mutex_create(OLA_PAL_MUTEX_TYPE_NORMAL);
    }
    ola_pal_mutex_lock(g_file_mtx);    

    fd = ola_pal_fopen(key, "rb+" );
    if (fd == NULL)
    {
        goto RET;
    }

    if(stat(key, &file_info) < 0)
    {
        goto RET;
    }
    length = file_info.st_size + 1;
    buffer = (char *)ola_pal_malloc(length);
    if (!buffer)
    {
        length = -1;
        goto RET;
    }
    
    ola_pal_memset(buffer, 0, length);
    length = ola_pal_fread(buffer, 1, length, fd );
    ola_pal_fclose(fd);
    *value = buffer;

RET:
    ola_pal_mutex_unlock(g_file_mtx);

    return length;
#else
    return -1;
#endif
}

